﻿//using SoftCommon;
using System;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Linq;

namespace DataAchive
{
    public static class Setting
    {
        private static readonly XmlDocument xmlDoc = new XmlDocument();
        public static int GetElementIntValue(string elementName)
        {
            try
            {
                int.TryParse(GetElementTextValue(elementName), out int elementNameInt);
                return elementNameInt;
            }
            catch (Exception)
            {
                //Log.Write("GetElementIntValue:" + e.Message);
                return 0;
            }
        }

        public static XmlNode GetXmlNode(string nodeName)
        {
            try
            {
                xmlDoc.Load("Setting.xml");
                XmlNode list = xmlDoc.SelectSingleNode(nodeName);
                return list;
            }
            catch (Exception)
            {
                return null;
            }
        }

        public static string GetElementTextValue(string elementName)
        {
            try
            {
                xmlDoc.Load("Setting.xml");
                XmlNodeList lis = xmlDoc.GetElementsByTagName(elementName);
                var elementNameStr = lis[0].InnerText;
                return elementNameStr;
            }
            catch (Exception)
            {
                //Log.Write("GetElementTextValue:" + e.Message);
                return "";
            }

        }
        public static List<string> GetElementListValue(string elementName)
        {
            try
            {
                var list = new List<string>();
                xmlDoc.Load("Setting.xml");
                XmlNodeList lis = xmlDoc.GetElementsByTagName(elementName);
                foreach (XmlNode lis2 in lis)
                {
                    list.Add(lis2.InnerText);
                }
                return list;
            }
            catch (Exception)
            {
                //Log.Write("GetElementListValue:" + e.Message);
                return null;
            }
        }

        public static void UpdateSettingfileNodes(string nodeName, XmlNode newNodes)
        {
            // 保存修改后的 XML 文件
            xmlDoc.Save("Setting.xml");//保存。 

        }
        public static void Save()
        {
            // 保存修改后的 XML 文件
            xmlDoc.Save("Setting.xml");//保存。 

        }

        /// <summary>
        /// 写入或更新节点内容
        /// </summary>
        /// <param name="nodePath">节点路径（如 "Root/Setting/Value"）</param>
        /// <param name="nodeValue">要写入的节点值</param>
        /// <param name="createIfNotExist">如果节点不存在，是否自动创建（默认：true）</param>
        /// <returns>是否写入成功</returns>
        public static bool SetXmlNodeValue(string nodePath, string nodeValue, bool createIfNotExist = true)
        {
            try
            {
                xmlDoc.Load("Setting.xml"); // 加载 XML 文件

                XmlNode node = xmlDoc.SelectSingleNode(nodePath);
                if (node != null)
                {
                    // 节点已存在，直接更新值
                    node.InnerText = nodeValue;
                }
                else if (createIfNotExist)
                {
                    // 节点不存在，自动创建（需解析路径逐层创建）
                    CreateNodeByPath(nodePath, nodeValue);
                }
                else
                {
                    // 节点不存在且不创建，返回失败
                    return false;
                }

                // 保存更改到文件
                xmlDoc.Save("Setting.xml");
                return true;
            }
            catch (Exception ex)
            {
                SoftCommon.Log.Write($"写入节点失败：{ex.Message}");
                return false;
            }
        }

        /// <summary>
        /// 根据路径逐层创建节点（辅助方法）
        /// </summary>
        private static void CreateNodeByPath(string nodePath, string nodeValue)
        {
            string[] nodeNames = nodePath.Split('/'); // 拆分路径（如 "Root/Setting" → ["Root", "Setting"]）
            XmlNode currentNode = (XmlNode)xmlDoc.DocumentElement ?? xmlDoc; ; // 从根节点开始

            for (int i = 0; i < nodeNames.Length; i++)
            {
                string nodeName = nodeNames[i];
                // 查找当前层级是否存在该节点
                XmlNode childNode = currentNode.SelectSingleNode(nodeName);

                if (childNode == null)
                {
                    // 不存在则创建新节点
                    childNode = xmlDoc.CreateElement(nodeName);
                    currentNode.AppendChild(childNode);
                }

                // 移动到下一层级
                currentNode = childNode;

                // 如果是最后一个节点，设置其值
                if (i == nodeNames.Length - 1)
                {
                    currentNode.InnerText = nodeValue;
                }
            }
        }

    }
}
